LuCloud 5 Q & A Why MapReduce Use Text?

LuCloud 5 Q & A Why MapReduce Use Text?

五月 19, 2019

cover

Text类和String类的一些区别

  • 索引Indexing:由于强调使用标准的UTF-8,因此Text和Java String类之间存在一些差异。 Text类的索引是在编码字节序列中的位置,而不是字符串中的Unicode字符,或Java char代码单元(就像String一样)。例如,charAt()返回一个表示Unicode代码点的int,与返回char的String变量不同。

  • 迭代Iteration:迭代文本中的Unicode字符会因使用字节偏移进行索引而变得复杂,因为不能只增加索引。

  • 可变Mutable:与String的另一个区别是Text是可变的。可以通过调用其中一个set()方法来重用Text实例。

  • 求助于字符串:Text没有像java.lang.String那样丰富的用于操作字符串的API,因此在许多情况下,需要将Text对象转换为String(通过使用toString()方法完成)。

MapReduce为什么要用Text类

Text实现了Comparable,Writable和WritableComparable等接口。这些接口都是MapReduce所必需的:

  • 当reducer对键进行排序时使用Comparable接口用于比较;

  • 为了Hadoop的有效性,应优化序列化/反序列化过程,因为群集中的节点之间会发生大量远程调用。因此序列化格式应该快速,紧凑,可扩展和可互操作。此时不应该使用java Serializable,因为java Serializable对于hadoop来说太大或太重,而使用Writable API,不仅没有并发症,还会让使用这些新类的序列化过程变得更加清晰紧凑。